import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectionExample {
    public static void main(String[] args) {
        // 获取Integer类的关键属性
        // System.out.println("=== Integer类的关键属性 ===");
        // getClassKeyFields(Integer.class);
        
        // System.out.println("\n=== Double类的关键属性 ===");
        // getClassKeyFields(Double.class);
        
        // System.out.println("\n=== Character类的关键属性 ===");
        // getClassKeyFields(Character.class);

        testLongToIntOverflow();
    }
    /**
     * 题目一：
     *      将3.1415926f（float）转成保留 4 位小数的定点数（用Math.round结合除法实现，
     *      如(int)(3.1415926f * 10000) / 10000.0），测试并记录精度丢失情况；
     */
    public static void testFloatPrecision() {
       float original = 3.1415926f;
       int scaled = (int)(Math.round(original * 10000) / 10000.0);
       System.out.println(scaled);
    }
    /**
     * 题目二：把long类型的1234567890123L转成int，捕获可能的溢出异常（用try - catch）；
     */
    public static void testLongToIntOverflow() {
        long longValue = 1234567890123L;
        long val = Integer.MAX_VALUE + 10L;
        if(val > Integer.MAX_VALUE || val < Integer.MIN_VALUE) {
            System.out.println("溢出");
            return;
        }else{
            int result = (int)val;
            System.out.println("转换成功，int值为: " + result);
        }
        try {
            int intValue = Math.toIntExact(longValue);
            System.out.println("转换成功，int值为: " + intValue);
        } catch (ArithmeticException e) {
            System.out.println("溢出异常: " + e.getMessage());
        }
    }
    /**
     * 使用反射获取类的关键静态字段
     * Class.getFields() 是 Java 反射 API 中的一个重要方法，用于获取类的字段信息。
     * 它返回一个包含所有公共字段（public fields）的数组，包括从父类继承的字段。
     * 通过这个方法，可以动态地检查类的结构，获取字段的名称、类型和值等信息。
     * 这在调试、序列化、框架设计等场景中非常有用。
     * @param clazz 要反射的类
     */
    public static void getClassKeyFields(Class<?> clazz) {
        try {
            // 获取类的所有公共字段（包括继承的字段）
            Field[] fields = clazz.getFields();
            
            // 遍历所有字段
            for (Field field : fields) {
                // 只处理静态字段（static修饰符）
                if (Modifier.isStatic(field.getModifiers())) {
                    try {
                        // 获取字段值（因为是静态字段，所以传入null作为对象参数）
                        Object value = field.get(null);
                        
                        // 输出字段信息：字段名 = 字段值 (字段类型)
                        System.out.printf("%s = %s (%s)%n", 
                            field.getName(), 
                            value, 
                            field.getType().getSimpleName());
                    } catch (IllegalAccessException e) {
                        // 处理无法访问的字段
                        System.out.printf("%s = [无法访问] (%s)%n", 
                            field.getName(), 
                            field.getType().getSimpleName());
                    } catch (Exception e) {
                        // 处理其他异常
                        System.out.printf("%s = [获取值失败] (%s)%n", 
                            field.getName(), 
                            field.getType().getSimpleName());
                    }
                }
            }
            
        } catch (Exception e) {
            System.out.println("获取字段时发生错误: " + e.getMessage());
        }
    }
}